#ifndef SOCKETCOMM_H
#define SOCKETCOMM_H

#include <QObject>
#include <QTcpSocket>
#include <QHostAddress>
#include <QTextCodec>
#include <QTimer>
#include <QDebug>
#include <QThread>
#include "commanddefine.h"

class SocketComm : public QObject
{
    Q_OBJECT
public:
    explicit SocketComm(QString ip, int port, QObject *parent = nullptr);

    bool ConnectToMain();
    void disConnectToMain();

private:
    QString main_ip;
    int main_port;
    QByteArray recbuffer;
    QTextCodec* codec;
    bool isFocusing = false; // 调焦是否完成

    QTcpSocket *m_socketMain = nullptr;
    QTimer *m_replyTimer = nullptr;
    QString m_pendingCommand;                                       // 当前等待响应的命令标识

private slots:
    void onReadyRead();                                             // 接收数据
    void DataProcess(const QString &data);                          // 解析接收的数据
    void sendCommand(const QByteArray &cmd);                        // 发送命令
    void waitForReply(const QString &cmdId, int timeoutMs = 3000);  // 等待回复
    void onTimeout();                                               // 已超时

signals:
    void operationFailed(const QString &cmd);



public:
    // ========== 灯光控制 ==========
    void setLaserOn(bool on);
    void setRedLight(bool on);
    void setGreenLight(bool on);
    void setBlueLight(bool on);
    // ========== 衰减器控制 ==========
    void setVOAOn(bool on);
    void setVOAVoltage(int voltage); // 0~5000
    // ========== 光开关控制 ==========
    void selectOpticalChannel(int channel); // 0~4
    // ========== 调焦控制 ==========
    void moveFocusAB();
    void moveFocusAC();
    void moveFocusAD();
    void moveFocusBC();
    void moveFocusBD();
    void moveFocusCD();
    // ========== 回零/位置控制 (FUS) ==========
    void startHome();
    void startMotion();
    void stopMotion();
    void startPosition(double speed, double pos);
    // ========== 风扇控制 (FAN) ==========
    void setFanTemp(int startTemp, int fullTemp); // 0-255
    void readFanTemp();
    // ========== 激光器温度控制 (LAS) ==========
    void setLaserTemp(double temp); // -400.0 ~ 1000.0 ℃
    void queryLaserTemp();
    // ========== 光纤炉温度控制(大) (FTC) ==========
    void setFurnaceTemp(int channel, double temp); // channel: 1 or 2
    void queryFurnaceTemp(int channel); // 1~2
    // ========== 传感器查询 ==========
    void queryEnvironment(); // 温湿度气压
    void queryFurnaceDualTemp(); // 光纤炉温度

signals:
    // ========== 返回信号 ==========
    void SendTemAB(double tempA, double tempB);                             // 光纤炉温度(温度A、温度B)
    void SendEnvThree(double temp, double humidity, double pressure);       // 温度、湿度、气压(温度、湿度、气压)
    void SendLightChannelOn(int channelIndex);                              // 光开关(通道)
    void SendFocusMove(bool ok);                                            // 调焦运动完成(是否)
    void SendFocusSetok(bool ok);                                           // 调焦设定完成(是否)
    void SendFocusWarn(bool ok);                                            // 调焦到达上限位(是否)
    void SendFanSetok(bool ok);                                             // 风扇控制设定完成(是否)
    void SendFanTem(int temp);                                              // 风扇控制(读取当前温度)
    void SendLaserTemSetok(bool ok);                                        // 激光器温度控制 双层 (是否)
    void SendLaserTem(double temp);                                         // 激光器温度控制(读取当前温度)
    void SendStoveTemSetok(bool ok);                                        // 光纤炉温度控制（大）设置温度成功(是否)
    void SendStoveTemSetErr(bool ok);                                       // 光纤炉温度控制（大）设置温度报错(是否)
    void SendStoveTemRead(int channel, double temp);                        // 光纤炉温度控制（大）温度查询(通道、温度)
    void SendStoveTemReadErr(bool ok);                                      // 光纤炉温度控制（大）温度查询报错(是否)
};

#endif // SOCKETCOMM_H
